package com.yztctech.android_11_02_optionsmenu_xml;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import java.lang.reflect.Method;

/**
 * 演示通过menu资源生成OptionsMenu
 * 备注:
 * 1. 通过xml文件加载数据;xml就是数据源
 * 2. 通过反射的方法,得到被封装的,MenuBuilder类中的setOptionalIconsVisible,然后通过此方法设置menu的icon可见
 */
public class MainActivity extends AppCompatActivity {

    private TextView testTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testTextView = (TextView)findViewById(R.id.tv_test);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //加载menu资源----------------------》menu布局加载器，实例化菜单布局到menu对象，以后就靠对象产生逻辑代码了，万物皆对象
        getMenuInflater().inflate(R.menu.menu_main, menu);

        //设置icon显示，不是对所有机型有效----》有可能显示不出来 模拟器就显示不出来
        setMenuIconEnable(menu, true);
        return true;
    }

    @Override//---------》不需要实现接口 直接重写方法就可以了，平常使用对象说话，item没办法了，子view太多了，就拿ID说话
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_visible:
                testTextView.setVisibility(View.VISIBLE);//=====>View的属性
                break;
            case R.id.menu_invisible:
                testTextView.setVisibility(View.INVISIBLE);
                break;
            case R.id.menu_color_black:
                testTextView.setTextColor(Color.BLACK);//Color的属性
                break;
            case R.id.menu_color_red:
                testTextView.setTextColor(Color.RED);
                break;
            case R.id.menu_color_blue:
                testTextView.setTextColor(Color.BLUE);
                break;
        }
        return true;
    }

    /**
     * 通过反射使得菜单图标可以显示出来--------->有些方法 系统封装了，没法使用，反射可以使用？？
     * @param menu 菜单
     * @param flag 是否显示icon
	 * 方法工具类
     */
    private void setMenuIconEnable(Menu menu, boolean flag) {

        try {
            // 得到MenuBuilder类对应的字节码
            Class<?> clazz = Class
                    .forName("com.android.internal.view.menu.MenuBuilder");
            // 得到MenuBuilder类中的setOptionalIconsVisible(boolean flag)方法
            Method method = clazz.getDeclaredMethod(
				"setOptionalIconsVisible",//底层设置的是icon不可见
                    boolean.class);
            // 设置方法的访问性
            method.setAccessible(true);
            // 执行该方法
            // menu.setOptionalIconsVisible(true);
            method.invoke(menu, flag);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
